package br.com.caim.email.dao;

import java.sql.SQLException;
import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;

import oracle.toplink.essentials.exceptions.DatabaseException;

import br.com.caim.bo.entidade.Conta;
import br.com.caim.bo.entidade.Provedor;
import br.com.caim.bo.entidade.Usuario;
import br.com.caim.email.excecoes.negocio.NenhumUsuarioEncontradoException;
import br.com.caim.email.excecoes.negocio.NenhumaContaEncontrada;
import br.com.caim.email.excecoes.negocio.ProvedorDeEmailInvalidoException;

public class Persistencia {
	private EntityManagerFactory emf = Persistence.createEntityManagerFactory("caim");
	
	public Usuario pesquisarUsuario(Usuario user) throws NenhumUsuarioEncontradoException {
		EntityManager em = emf.createEntityManager();
		
		Query query = em.createQuery("select c from Usuario c where c.login = '"+ user.getLogin() + "' " +
				"and c.senha = '" + user.getSenha() + "'");
		
		Usuario usuario = null;
		
		try {
			usuario = (Usuario) query.getSingleResult();
		} catch(NoResultException nre) {
			nre.printStackTrace();
			throw new NenhumUsuarioEncontradoException("Nenhum Usuário de login " + user.getLogin() + " foi encontrado.");
		}
		
		return usuario;
	}
	
	public Collection<Conta> pesquisarContasUsuario(String idUsuario) throws NenhumaContaEncontrada {
		EntityManager em = emf.createEntityManager();
		
		Query query = em.createQuery("select c from Conta c where c.usuario.id =" + idUsuario);
		
		Collection contas = null;
		try {
			contas = query.getResultList();
		} catch(NoResultException nre) {
			nre.printStackTrace();
			throw new NenhumaContaEncontrada();
		}
		
		return contas;
	}
	
	public Provedor pesquisarProvedor(String nomeProvedor) throws ProvedorDeEmailInvalidoException {
		EntityManager em = emf.createEntityManager();
		
		Query query = em.createQuery("select c from Provedor c where c.nome like '" + nomeProvedor + "'");
		
		Provedor provedor = null;
		
		try {
			provedor = (Provedor) query.getSingleResult();
		} catch(NoResultException nre) {
			nre.printStackTrace();
			throw new ProvedorDeEmailInvalidoException("O Provedor de Email de nome " + nomeProvedor + " é inválido. Os provedores permitidos são: GMAIL, YAHOO e HOTMAIL."); 
		}
		
		return provedor;
	}
	
	public Conta pesquisarContaUsuario(String usuarioId, String enderecoConta) throws NenhumaContaEncontrada {
		EntityManager em = emf.createEntityManager();
		
		Query query = em.createQuery("SELECT c FROM Conta c " +
									 "where c.usuario.id = " + usuarioId + 
									 "and c.enderecoEmail like '" + enderecoConta + "'");
		
		Conta conta = null;
		
		try {
			conta = (Conta) query.getSingleResult(); 
		} catch(NoResultException nre) {
			nre.printStackTrace();
			throw new NenhumaContaEncontrada("A Conta de endereço " + enderecoConta + " não foi encontrada.");
		}
		
		return conta;
	}
	
	/*
	 * PERSISTENCIAS
	 */
	
	public void persistirObjeto(Object bo) {
		EntityManager em = emf.createEntityManager();
		
		em.getTransaction().begin();
		
		em.merge(bo);
		
		em.getTransaction().commit();
		
		em.close();
	}
	
	public void removerObjeto(String usuarioId, String enderecoConta) {
		EntityManager em = emf.createEntityManager();
		
		em.getTransaction().begin();
		
		Query query = em.createQuery("SELECT c FROM Conta c " +
				 "where c.usuario.id = " + usuarioId + 
				 "and c.enderecoEmail like '" + enderecoConta + "'");

		em.remove((Conta) query.getSingleResult());
		
		em.getTransaction().commit();
		
		em.close();
	}
}
